#ifndef JUEGO_H_
#define JUEGO_H_

#define CANTIDAD_DADOS 5
#define MAX_CANTIDAD_DADOS_PARA_ATACAR 3
#define MAX_CANTIDAD_DADOS_PARA_DEFENDER 2

#include "Territorio.h"
#include "Ataque.h"
#include "Jugador.h"
#include "Dado.h"
#include "Mapa.h"
#include "mutex.h"
#include <vector>
#include <list>
using namespace std;

/**
 *Esta clase contiene todas las acciones disponibles para el jugador durante una
 *partida de Risk. Ademas, contiene el estado del Juego que es visible tanto para los
 *clients como para el servidor.
**/

class Juego
{
protected:
	unsigned int cantidadDeJugadores;
	int turno;
	red::hilos::thread::Mutex mapa_Mutex;
	vector<Jugador*> jugadores;
	list<Dado*> dadosAtacante;
	list<Dado*> dadosDefensor;
	Mapa* mapaDelJuego;
	
public:
	Juego(unsigned int cantidadDeJugadores, Mapa* mapa);
	
	virtual void colocarEjercitos(Jugador* jugador, Territorio* territorio, unsigned int cantidadDeEjercitos) = 0;
	
	virtual void realizarAtaque(Ataque* ataque) = 0;
	
	virtual void tirarDados(Jugador* jugador, unsigned int cantidadDeDados) = 0;
	
	virtual void moverEjercitos(Jugador* jugador, Territorio* origen, Territorio* destino, unsigned int cantidadDeEjercitos) = 0;
	
	virtual void pasar(Jugador* jugador) = 0;
	
	virtual void abandonar(Jugador* jugador) = 0;
	
	Mapa* getMapa();
	
	virtual void setTurno(int turno);
	
	virtual void setTurno(string colorJugador);
	
	unsigned int getCantidadDeJugadores();
	
	vector<Jugador*>* getJugadores();
	
	list<Dado*>* getDadosAtacante();

	list<Dado*>* getDadosDefensor();
	
	Jugador* getJugador(string colorJugador);
	
	Jugador* getJugadorEnTurno();
		
};

#endif /*JUEGO_H_*/
